/**
 * 上传文件
 * @author xiaoqiang <465633678@qq.com>
 * @created 2018/11/02 15:14:19
 */
const Busboy = require('busboy')
const { getExtname, mkdirSync } = require('./index')
const fs = require('fs')
const path = require('path')
const inspect = require('util').inspect

/**
 * 上传文件方法
 * @param {Object} ctx 上下文
 * @param {*} options 上传配置
 */
function uploadFile (ctx, options) {
  const req = ctx.req
  /**
   * 如果没设置type
   * 则为common目录
   */
  const fileType = options.fileType || 'common'
  // 上传文件目录
  const uploadPath = path.join(options.path, fileType)
  /**
   * 判断是否有文件夹或创建
   */
  mkdirSync(uploadPath)
  /**
   * 返回promise
   */
  return new Promise((rs, rj) => {
    /**
     * 返回数据
     */
    const result = {
      success: false,
      formData: [],
      data: {},
      message: ''
    }
    try {
      // 实例化Busboy
      const busboy = new Busboy({ headers: req.headers })
      /**
       * 解析file
       */
      busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
        // 后缀名
        const extname = getExtname(filename)
        // 上传后的文件名
        filename = Math.random().toString(16).slice(2) + extname
        // 上传后的文件路径
        const saveTo = path.join(uploadPath, filename)
        // pipe进文件路径
        file.pipe(fs.createWriteStream(saveTo))
        /**
         * 上传完成
         */
        file.on('end', () => {
          result.success = true
          result.message = '上传成功'
          result.data.url = `http://${ctx.host}/${fileType}/${filename}`
          rs(result)
        })
      })
      /**
       * 解析字段
       */
      busboy.on('field', (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) => {
        result.formData[fieldname] = inspect(val)
      })
      /**
       * 解析完成
       */
      busboy.on('finish', () => {
        rs(result)
      })
      busboy.on('error', () => {
        rj(result)
      })
      req.pipe(busboy)
    } catch (e) {
      throw new Error(e)
    }
  })
}
// 导出模块
module.exports = uploadFile